﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using System.Configuration;
using Mvc.Validation.Validators;
using System.Security.Cryptography;
using System.Text;
using System.Globalization;

namespace web_uchet.Classes.Payment
{
    //[Bind(Include = "UserName,PW,s_amount")]
    public class Payment
    {
        // the function returns an MD5 of parameters passed
        // функция возвращает MD5 переданных ей параметров
        private string ref_sign(params string[] argv)
        {
            string prehash = "";
            for (int i = 0; i < argv.Length; ++i)
            {
                prehash += argv[i] + ((i + 1 < argv.Length) ? "::" : "");
            }

            MD5 md5 = MD5CryptoServiceProvider.Create();
            byte[] posthash = md5.ComputeHash(Encoding.UTF8.GetBytes(prehash));

            StringBuilder retval = new StringBuilder();
            for (int i = 0; i < posthash.Length; ++i)
            {
                retval.Append(posthash[i].ToString("x2"));
            }
            return retval.ToString();
        }
        private string ref_signASCII(params string[] argv)
        {
            string prehash = "";
            for (int i = 0; i < argv.Length; ++i)
            {
                prehash += argv[i] + ((i + 1 < argv.Length) ? "::" : "");
            }

            MD5 md5 = MD5CryptoServiceProvider.Create();
            byte[] posthash = md5.ComputeHash(Encoding.ASCII.GetBytes(prehash));

            StringBuilder retval = new StringBuilder();
            for (int i = 0; i < posthash.Length; ++i)
            {
                retval.Append(posthash[i].ToString("x2"));
            }
            return retval.ToString();
        }
        public Payment()
        {
            
        }
        private int _s_purse;
        private int _s_order_id;
        private float _s_amount;
        private int _s_clear_amount;
        private int _s_inv;

        public string s_purse
        {
            get { return this._s_purse.ToString(CultureInfo.InvariantCulture); }
            set { this._s_purse = int.Parse(value, CultureInfo.InvariantCulture); }
        }
        public string s_order_id
        {
            get { return this._s_order_id.ToString(CultureInfo.InvariantCulture); }
            set { this._s_order_id = int.Parse(value, CultureInfo.InvariantCulture); }
        }
        public string s_amount
        {
            get { return this._s_amount.ToString(CultureInfo.InvariantCulture); }
            set { this._s_amount = float.Parse(value.Replace(',','.'), CultureInfo.InvariantCulture); }
        }
        public string s_clear_amount
        {
            get { return this._s_clear_amount.ToString(CultureInfo.InvariantCulture); }
            set { this._s_clear_amount = int.Parse(value, CultureInfo.InvariantCulture); }
        }
        public string s_inv
        {
            get { return this._s_inv.ToString(CultureInfo.InvariantCulture); }
            set { this._s_inv = int.Parse(value, CultureInfo.InvariantCulture); }
        }

        public string s_description { get; set; }
        public string s_phone { get; set; }
        public string CompanyName { get; set; }

        public string s_sign
        {
            get;
            set;
        }
        public string s_sign_v2 { get; set; }
        public string secret_code { get; set; }

        public int CompanyID { get; set; }
        [NotNullOrEmptyValidator(MessageTemplate="Введите имя любого пользователя компании")]
        public string UserName { get; set; }
        [NotNullOrEmptyValidator(MessageTemplate = "Введите пароль пользователя")]
        public string PW { get; set; }

        public string GetIndexSign()
        {
            return this.ref_sign(s_purse, s_order_id,
                s_amount, s_clear_amount, 
                s_description, secret_code);
        }
        public string GetResultSign()
        {
            return this.ref_sign(secret_code, s_purse, s_order_id,
                s_amount, s_clear_amount, s_inv, s_phone);
        }
        public void InitNew()
        {
            this.s_purse = ConfigurationManager.AppSettings["s_purse"];
            this.s_clear_amount = (ConfigurationManager.AppSettings["s_clear_amount"]);
            this.s_description = (ConfigurationManager.AppSettings["s_description"]);
            this.secret_code = (ConfigurationManager.AppSettings["secret_code"]);
        }
    }
}
//s_purse  	int  	Идентификатор вашего смс:банка в системе.
//s_order_id 	int 	Идентификатор операции (произвольное число, служит для соотнесения инициированной транзакции с ее результатом).
//s_amount 	float 	Сумма транзакции, USD.
//s_clear_amount 	int(1) 	Алгоритм подсчета стоимости услуги для пользователя. Если 0, то значение s_amount представляет собой конечную стоимость для пользователя, иначе - значение s_amount выражает ожидаемую вами прибыль от операции; стоимость для каждого пользователя будет варьироваться в зависимости от действующих тарифов и условий приема сообщений местными сотовыми операторами.
//s_description 	char(127) 	Описание_Услуги операции (произвольная строка длиной не более 127 символов, служит для удобства разграничения целевых платежей). Обрабатывается как UTF-8.
//s_sign 	char(32) 	MD5-хэш строки, состоящей из соединенных через двойное двоеточие ("::") параметров s_purse, s_order_id, s_amount, s_clear_amount, s_description и secret_code (в указанном порядке), где secret_code - секретный ключ Вашего смс:банка.
